/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package contatos.presenter;

import contatos.collection.Contatos;
import contatos.model.Contato;
import contatos.patterns.observer.Observer;
import grafico.strategy.GraficoBarraStrategy;
import grafico.strategy.GraficoColunaStrategy;
import grafico.strategy.IGraficoStrategy;
import contatos.view.GraficoView;
import grafico.builder.GraficoOperadoraUfBuilder;
import grafico.builder.GraficoDirector;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.TreeSet;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 *
 * @author felipe
 */
public class GraficoPresenter implements Observer {

    private GraficoView view;
    private IGraficoStrategy strategy;
    private TreeSet<Contato> contatos;
    private JFrame frame;

    public GraficoPresenter(TreeSet<Contato> lista) {
        view = new GraficoView();
        this.contatos = lista;

        //botao ok
        view.getBtnOk().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                criarGrafico();
            }
        });

        //botao fechar
        view.getBtnFechar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                view.setVisible(false);
                removeObserver();
                view.dispose();

            }

        });

        //criando um novo frame para ser a tela do grafico
        frame = new JFrame("Grafico de operadoras por estado");
        frame.setSize(new Dimension(800, 600));
        frame.setLocationRelativeTo(view);
        view.setVisible(true);
    }

    private void removeObserver() {
        try {
            Contatos.getInstancia().removeObserver(this);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(view, ex.getMessage());
        }
    }

    private void criarGrafico() {
        try {
            switch (view.getCbGrafico().getSelectedIndex()) {
                case -1:
                    throw new Exception("Selecione como o gráfico será gerado");
                case 0:
                    strategy = new GraficoColunaStrategy();
                    break;
                case 1:
                    strategy = new GraficoBarraStrategy();
                    break;
            }

            //uso do padrão builder
            //note que minha aplicação ficou sem nenhuma dependencia com o JFreeChart, somente as classes builder
            GraficoDirector graficoDirector = new GraficoDirector(new GraficoOperadoraUfBuilder(contatos, strategy));
            graficoDirector.ConstruirGrafico();

            //obtendo o panel grafico do meu builder e configurando
            JPanel graficoPanel = graficoDirector.getGraficoPanel();
            graficoPanel.setPreferredSize(new Dimension(800, 600));
            graficoPanel.setVisible(true);

            frame.getContentPane().removeAll();
            frame.add(graficoDirector.getGraficoPanel());   //adicionando o grafico ao frame
            frame.setVisible(true);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(view, e.getMessage());
        }
    }

    @Override
    public void update(Contatos pessoas) {
        contatos = pessoas.getCompletos();
        frame.getContentPane().removeAll();
        criarGrafico();
    }
}
